package com.medsys.appservice;

import java.io.Serializable;
import java.util.Date;
import java.util.List;



import com.medsys.dao.DAOFactory;
import com.medsys.dao.ConsultaDAO;
import com.medsys.model.Consulta;

/**
 * Classe de servi�os para a classe {@link Consulta}.
 * 
 * @author Felipe Lauksas
 * 
 */
public class ConsultaAppService {

	/**
	 * M�todo para salvar um objeto {@link Consulta} no banco de dados.
	 * 
	 * @param funcionario
	 *            do tipo {@link Consulta}.
	 */
	public Consulta salvar(Consulta consulta) {

		DAOFactory daoFactory = DAOFactory.getDAOFactory();

		ConsultaDAO consultaDAO = daoFactory.getConsultaDAO();

		try {

			daoFactory.iniciarTransacao();

			consulta = consultaDAO.salvar(consulta);

			daoFactory.encerrarTransacao();

		} catch (Exception e) {

			daoFactory.cancelarTransacao();

		} finally {

			daoFactory.fechar();

		}
		
		return consulta;
	}

	/**
	 * M�todo para alterar um objeto {@link Consulta} no bando de dados.
	 * 
	 * @param consulta
	 *            do tipo {@link Consulta}.
	 */
	public void alterar(Consulta consulta) {

		DAOFactory daoFactory = DAOFactory.getDAOFactory();

		ConsultaDAO consultaDAO = daoFactory.getConsultaDAO();

		try {

			daoFactory.iniciarTransacao();

			consultaDAO.alterar(consulta);

			daoFactory.encerrarTransacao();

		} catch (Exception e) {

			daoFactory.cancelarTransacao();

		} finally {

			daoFactory.fechar();

		}
	}

	/**
	 * M�todo que retorna uma {@link List} com objetos do tipo {@link Consulta}.
	 * 
	 * @return Objeto do tipo {@link List} com objetos do tipo {@link Consulta}
	 *         de todo o banco de dados.
	 */
	public List<Consulta> listarTodos() {

		DAOFactory daoFactory = DAOFactory.getDAOFactory();

		ConsultaDAO consultaDAO = daoFactory.getConsultaDAO();

		List<Consulta> listConsultas = null;

		try {

			listConsultas = consultaDAO.listarTodos();

		} catch (Exception e) {

			daoFactory.cancelarTransacao();

		} finally {

			daoFactory.fechar();

		}

		return listConsultas;

	}
	
	
	public Consulta recuperarConsultaERelatorios(Serializable id) {

		DAOFactory daoFactory = DAOFactory.getDAOFactory();

		ConsultaDAO consultaDAO = daoFactory.getConsultaDAO();

		Consulta consulta = null;

		try {

			consulta = consultaDAO.recupararConsultaEReceituarios(id);

		} catch (Exception e) {

			daoFactory.cancelarTransacao();

		} finally {

			daoFactory.fechar();

		}

		return consulta;

	}

	/**
	 * M�todo que pesquisa um objeto do tipo {@link Consulta} no banco de dados
	 * 
	 * @param Objeto
	 *            {@link Long} referente ao ID do paciente
	 * @return Objeto do tipo {@link Consulta}
	 */
	public Consulta pesquisarPorId(Long id) {

		DAOFactory daoFactory = DAOFactory.getDAOFactory();

		ConsultaDAO consultaDAO = daoFactory.getConsultaDAO();

		Consulta consulta = null;

		try {

			consulta = consultaDAO.pesquisarPorId(id);

		} catch (Exception e) {

			daoFactory.cancelarTransacao();

		} finally {

			daoFactory.fechar();

		}

		return consulta;

	}

	/**
	 * M�todo que pesquisa um objeto do tipo {@link Consulta} no banco de dados
	 * 
	 * @param Objeto
	 *            {@link Long} referente ao ID do paciente
	 * @return Objeto do tipo {@link Consulta}
	 */
	public List<Consulta>  pesquisarPorPeriodo(Date inicioPeriodo, Date fimPeriodo) {

		DAOFactory daoFactory = DAOFactory.getDAOFactory();

		ConsultaDAO consultaDAO = daoFactory.getConsultaDAO();

		List<Consulta> listConsultas = null;

		try {

			listConsultas = consultaDAO.pesquisarPorPeriodo(inicioPeriodo, fimPeriodo);

		} catch (Exception e) {

			daoFactory.cancelarTransacao();

		} finally {

			daoFactory.fechar();

		}

		return listConsultas;

	}

}
